const { ipcRenderer } = require('electron')

/**
 * 调试器API封装
 */
const debuggerApi = {
  /**
   * 检查dlv版本
   */
  checkDlvVersion() {
    return ipcRenderer.invoke('dlv:checkVersion')
  },

  /**
   * 选择dlv路径
   */
  selectDlvPath() {
    return ipcRenderer.invoke('dlv:selectPath')
  },

  /**
   * 获取当前dlv路径
   */
  getDlvPath() {
    return ipcRenderer.invoke('dlv:getPath')
  },

  /**
   * 选择文件
   */
  selectFile() {
    return ipcRenderer.invoke('dialog:selectFile')
  },

  /**
   * 启动调试器
   */
  startDebugger(programPath, args) {
    return ipcRenderer.invoke('debugger:start', { programPath, args })
  },

  /**
   * 停止调试器
   */
  stopDebugger() {
    return ipcRenderer.invoke('debugger:stop')
  },

  /**
   * 继续执行
   */
  continue() {
    return ipcRenderer.invoke('debugger:continue')
  },

  /**
   * 暂停执行
   */
  pause() {
    return ipcRenderer.invoke('debugger:pause')
  },

  /**
   * 单步执行（步过）
   */
  stepOver() {
    return ipcRenderer.invoke('debugger:stepOver')
  },

  /**
   * 单步执行（步入）
   */
  stepInto() {
    return ipcRenderer.invoke('debugger:stepInto')
  },

  /**
   * 单步执行（步出）
   */
  stepOut() {
    return ipcRenderer.invoke('debugger:stepOut')
  },

  /**
   * 设置断点
   */
  setBreakpoint(file, line, condition = null, hitCondition = null) {
    return ipcRenderer.invoke('debugger:setBreakpoint', { file, line, condition, hitCondition })
  },

  /**
   * 删除断点
   */
  clearBreakpoint(id) {
    return ipcRenderer.invoke('debugger:clearBreakpoint', { id })
  },

  /**
   * 获取断点列表
   */
  getBreakpoints() {
    return ipcRenderer.invoke('debugger:getBreakpoints')
  },

  /**
   * 获取调用堆栈
   * @param {number} depth - 堆栈深度，默认 50
   * @param {number} goroutineID - 可选的 Goroutine ID
   */
  getStacktrace(depth = 50, goroutineID = -1) {
    return ipcRenderer.invoke('debugger:getStacktrace', { depth, goroutineID })
  },

  /**
   * 获取局部变量
   * @param {number} goroutineID - Goroutine ID，默认 -1 表示当前 goroutine
   * @param {number} frameIndex - 栈帧索引，默认 0 表示当前栈帧
   * @param {number} maxDepth - 最大递归深度
   */
  getLocalVariables(goroutineID = -1, frameIndex = 0, maxDepth = 3) {
    return ipcRenderer.invoke('debugger:getLocalVariables', { goroutineID, frameIndex, maxDepth })
  },

  /**
   * 求值表达式
   */
  evaluate(expression, maxDepth = 3) {
    return ipcRenderer.invoke('debugger:evaluate', { expression, maxDepth })
  },

  /**
   * 获取当前状态
   */
  getState() {
    return ipcRenderer.invoke('debugger:getState')
  },

  /**
   * 获取调试器状态
   */
  getCurrentState() {
    return ipcRenderer.invoke('debugger:getCurrentState')
  },

  /**
   * 获取源文件列表
   */
  listSources(filter = '') {
    return ipcRenderer.invoke('debugger:listSources', { filter })
  },

  /**
   * 获取 Goroutine 列表
   */
  listGoroutines() {
    return ipcRenderer.invoke('debugger:listGoroutines')
  },

  /**
   * 加载变量的子成员（按需加载）
   * @param {string} expr - 变量表达式
   * @param {number} goroutineID - Goroutine ID
   * @param {number} frameIndex - 栈帧索引
   */
  loadVariableChildren(expr, goroutineID = -1, frameIndex = 0) {
    return ipcRenderer.invoke('debugger:loadVariableChildren', { expr, goroutineID, frameIndex })
  },

  /**
   * 设置变量值
   * @param {string} symbol - 变量名称
   * @param {string} value - 新的值
   * @param {number} goroutineID - Goroutine ID
   * @param {number} frameIndex - 栈帧索引
   */
  setVariable(symbol, value, goroutineID = -1, frameIndex = 0) {
    return ipcRenderer.invoke('debugger:setVariable', { symbol, value, goroutineID, frameIndex })
  },

  /**
   * 监听输出
   */
  onOutput(callback) {
    ipcRenderer.on('debugger:output', (event, data) => {
      callback(data)
    })
  },

  /**
   * 监听错误
   */
  onError(callback) {
    ipcRenderer.on('debugger:error', (event, data) => {
      callback(data)
    })
  },

  /**
   * 监听退出
   */
  onExit(callback) {
    ipcRenderer.on('debugger:exit', (event, data) => {
      callback(data)
    })
  },

  /**
   * 监听断点命中
   */
  onBreakpointHit(callback) {
    ipcRenderer.on('debugger:breakpoint-hit', (event, data) => {
      callback(data)
    })
  },

  /**
   * 监听程序退出
   */
  onProgramExited(callback) {
    ipcRenderer.on('debugger:program-exited', (event, data) => {
      callback(data)
    })
  },

  /**
   * 加载调试历史记录
   */
  loadHistory() {
    return ipcRenderer.invoke('history:load')
  },

  /**
   * 保存调试历史记录
   * @param {Array} data - 历史记录数据
   */
  saveHistory(data) {
    return ipcRenderer.invoke('history:save', { data })
  },

  /**
   * 保存设置
   * @param {Object} settings - 设置对象
   */
  saveSettings(settings) {
    return ipcRenderer.invoke('settings:save', { settings })
  },

  /**
   * 加载设置
   */
  loadSettings() {
    return ipcRenderer.invoke('settings:load')
  }
}

export default debuggerApi
